package g

// ListNode 单向列表
type ListNode struct {
	Val  int
	Next *ListNode
}

/*
 * @lc app=leetcode.cn id=19 lang=golang
 *
 * [19] 删除链表的倒数第 N 个结点
给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
*/

// @lc code=start
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
	if head == nil {
		return nil
	}

	p := head
	var length int
	for p != nil {
		length++
		p = p.Next
	}
	if length == n { // 删除第一个节点
		return head.Next
	}

	//删除非第一个节点，p指向要删除节点的上个节点
	p = head
	for i := 0; i < length-n-1; i++ {
		p = p.Next
	}
	p.Next = p.Next.Next
	return head
}

// @lc code=end
